package com.webank.openledger.contracts;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

import org.fisco.bcos.sdk.abi.FunctionEncoder;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.datatypes.Address;
import org.fisco.bcos.sdk.abi.datatypes.Bool;
import org.fisco.bcos.sdk.abi.datatypes.DynamicArray;
import org.fisco.bcos.sdk.abi.datatypes.Event;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.Utf8String;
import org.fisco.bcos.sdk.abi.datatypes.generated.Int256;
import org.fisco.bcos.sdk.abi.datatypes.generated.StaticArray2;
import org.fisco.bcos.sdk.abi.datatypes.generated.Uint256;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple2;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple4;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.eventsub.EventCallback;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;

@SuppressWarnings("unchecked")
public class FungibleBook extends Contract {
    public static final String[] BINARY_ARRAY = {"60806040523480156200001157600080fd5b506040516200593638038062005936833981018060405262000037919081019062000354565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260019080600181540180825580915050906001820390600052602060002001600090919290919091505550611001600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a9080519060200190620000ff9291906200021b565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166356004b6a600a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200017a91906200055d565b602060405180830381600087803b1580156200019557600080fd5b505af1158015620001aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001d09190810190620003c3565b5080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000678565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200025e57805160ff19168380011785556200028f565b828001600101855582156200028f579182015b828111156200028e57825182559160200191906001019062000271565b5b5090506200029e9190620002a2565b5090565b620002c791905b80821115620002c3576000816000905550600101620002a9565b5090565b90565b6000620002d8825162000618565b905092915050565b6000620002ee825162000638565b905092915050565b600082601f83011215156200030a57600080fd5b8151620003216200031b82620005d9565b620005ab565b915080825260208301602083018583830111156200033e57600080fd5b6200034b83828462000642565b50505092915050565b6000806000606084860312156200036a57600080fd5b60006200037a86828701620002ca565b935050602084015167ffffffffffffffff8111156200039857600080fd5b620003a686828701620002f6565b9250506040620003b986828701620002ca565b9150509250925092565b600060208284031215620003d657600080fd5b6000620003e684828501620002e0565b91505092915050565b6000815460018116600081146200040f5760018114620004305762000475565b607f600283041680865260ff19831660208701526040860193505062000475565b60028204808652602086019550620004488562000606565b60005b828110156200046c578154818901526001820191506020810190506200044b565b80880195505050505b505092915050565b6000600782527f626f6f6b5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000606482527f7465726d5f6e6f2c7365712c66726f6d2c746f2c616d6f756e742c617373657460208301527f2c6f70657261746f722c646573632c7472616e73616374696f6e5f747970652c60408301527f6f7065726174696f6e5f747970652c7375626a6563742c72656c617465645f6160608301527f7373657400000000000000000000000000000000000000000000000000000000608083015260a082019050919050565b60006060820190508181036000830152620005798184620003ef565b905081810360208301526200058e816200047d565b90508181036040830152620005a381620004b4565b905092915050565b6000604051905081810181811067ffffffffffffffff82111715620005cf57600080fd5b8060405250919050565b600067ffffffffffffffff821115620005f157600080fd5b601f19601f8301169050602081019050919050565b60008160005260206000209050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200066257808201518184015260208101905062000645565b8381111562000672576000848401525b50505050565b6152ae80620006886000396000f300608060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806318d6f1711461006757806338cc4831146100a5578063521ae536146100d0578063e953d0af1461010d575b600080fd5b34801561007357600080fd5b5061008e6004803603610089919081019061405e565b610138565b60405161009c929190614982565b60405180910390f35b3480156100b157600080fd5b506100ba6105c9565b6040516100c79190614945565b60405180910390f35b3480156100dc57600080fd5b506100f760048036036100f29190810190614109565b6105d1565b6040516101049190614960565b60405180910390f35b34801561011957600080fd5b50610122610c92565b60405161012f9190614f3f565b60405180910390f35b6000610142613c9a565b600060606000806000610153613c9a565b60048c5110158015610166575060028951145b15156101a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161019e90614db9565b60405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663124b65b46040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561022c57600080fd5b505af1158015610240573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061026991908101906142d7565b80965081975050506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638662f51f6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156102f657600080fd5b505af115801561030a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061032e91908101906142ae565b935061033e86858e8e8e8e610cef565b9250600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f23f63c9600a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016103b89190614a4f565b602060405180830381600087803b1580156103d257600080fd5b505af11580156103e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061040a919081019061421b565b915060018273ffffffffffffffffffffffffffffffffffffffff166331afac36610454600260016002805490500381548110151561044457fe5b90600052602060002001546116b9565b866040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161048e929190614a1f565b602060405180830381600087803b1580156104a857600080fd5b505af11580156104bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104e09190810190614244565b141515610522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161051990614e63565b60405180910390fd5b61052d86858e611810565b60408051908101604052808781526020018581525090507f6acb627e94f15db3e6d10b82668ddd36dc340d2d921352d5e3a166bc08babada86858e600281518110151561057657fe5b906020019060200201518f600381518110151561058f57fe5b906020019060200201518f6040516105ab959493929190614f5a565b60405180910390a16001819750975050505050505094509492505050565b600030905090565b60606000606060006060600080606060008b5111806105f1575060008a51115b1515610632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062990614db9565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f23f63c9600a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016106aa9190614a4f565b602060405180830381600087803b1580156106c457600080fd5b505af11580156106d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106fc919081019061421b565b96506107088b8b611dca565b80965081975050508673ffffffffffffffffffffffffffffffffffffffff16637857d7c96040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561077457600080fd5b505af1158015610788573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107ac91908101906141a0565b92506000915060008b511180156107dc575060008b60008151811015156107cf57fe5b9060200190602002015114155b15610889578273ffffffffffffffffffffffffffffffffffffffff1663cd30a1d161081e8d600081518110151561080f57fe5b906020019060200201516116b9565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016108569190614c9a565b600060405180830381600087803b15801561087057600080fd5b505af1158015610884573d6000803e3d6000fd5b505050505b60018b511180156108b3575060008b60018151811015156108a657fe5b9060200190602002015114155b15610960578273ffffffffffffffffffffffffffffffffffffffff1663cd30a1d16108f58d60018151811015156108e657fe5b906020019060200201516116b9565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161092d9190614d0f565b600060405180830381600087803b15801561094757600080fd5b505af115801561095b573d6000803e3d6000fd5b505050505b60008a511180156109b65750600073ffffffffffffffff","ffffffffffffffffffffffff168a600081518110151561099357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610a79578273ffffffffffffffffffffffffffffffffffffffff1663cd30a1d1610a0e8c60008151811015156109e957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1661244e565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610a469190614bf7565b600060405180830381600087803b158015610a6057600080fd5b505af1158015610a74573d6000803e3d6000fd5b505050505b60018a51118015610acf5750600073ffffffffffffffffffffffffffffffffffffffff168a6001815181101515610aac57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610b92578273ffffffffffffffffffffffffffffffffffffffff1663cd30a1d1610b278c6001815181101515610b0257fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1661244e565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610b5f9190614b54565b600060405180830381600087803b158015610b7957600080fd5b505af1158015610b8d573d6000803e3d6000fd5b505050505b8273ffffffffffffffffffffffffffffffffffffffff16637ec1cc658a6000815181101515610bbd57fe5b906020019060200201518b6001815181101515610bd657fe5b906020019060200201516040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610c199291906149c6565b600060405180830381600087803b158015610c3357600080fd5b505af1158015610c47573d6000803e3d6000fd5b50505050610c568686856125c2565b809350819250505060008151118015610c6f5750600082135b15610c8157610c7e81836128ca565b93505b839750505050505050509392505050565b6000600260016002805490500190806001815401808255809150509060018203906000526020600020016000909192909190915055506002600160028054905003815481101515610cdf57fe5b9060005260206000200154905090565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f23f63c9600a6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610d6c9190614a4f565b602060405180830381600087803b158015610d8657600080fd5b505af1158015610d9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dbe919081019061421b565b91508173ffffffffffffffffffffffffffffffffffffffff166313db93466040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610e2457600080fd5b505af1158015610e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e5c91908101906141f2565b90508073ffffffffffffffffffffffffffffffffffffffff1663e942b516610ea46002600160028054905003815481101515610e9457fe5b90600052602060002001546116b9565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610edc9190614dd9565b600060405180830381600087803b158015610ef657600080fd5b505af1158015610f0a573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b516610f338a6116b9565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610f6b9190614d0f565b600060405180830381600087803b158015610f8557600080fd5b505af1158015610f99573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b516610fc28b6116b9565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610ffa9190614c9a565b600060405180830381600087803b15801561101457600080fd5b505af1158015611028573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b51661107f89600281518110151561105a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1661244e565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016110b79190614bf7565b600060405180830381600087803b1580156110d157600080fd5b505af11580156110e5573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b51661113c89600381518110151561111757fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1661244e565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016111749190614b54565b600060405180830381600087803b15801561118e57600080fd5b505af11580156111a2573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663a815ff158860018151811015156111d157fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016112139190614a91565b600060405180830381600087803b15801561122d57600080fd5b505af1158015611241573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b51661126a886116b9565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016112a29190614e2e565b600060405180830381600087803b1580156112bc57600080fd5b505af11580156112d0573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663a815ff158860008151811015156112ff57fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016113419190614c4c565b600060405180830381600087803b15801561135b57600080fd5b505af115801561136f573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663e942b51686600081518110151561139e57fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016113e09190614d64565b600060405180830381600087803b1580156113fa57600080fd5b505af115801561140e573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba7485600081518110151561143d57fe5b906020019060200201516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161147f9190614ec3565b600060405180830381600087803b15801561149957600080fd5b505af11580156114ad573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16632ef8ba748560018151811015156114dc57fe5b906020019060200201516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161151e9190614f11565b600060405180830381600087803b15801561153857600080fd5b505af115801561154c573d6000803e3d6000fd5b505050506001855111156115fa578073ffffffffffffffffffffffffffffffffffffffff1663e942b51686600181518110151561158557fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016115c79190614adf565b600060405180830381600087803b1580156115e157600080fd5b505af11580156115f5573d6000803e3d6000fd5b505050505b8073ffffffffffffffffffffffffffffffffffffffff1663a815ff15600589511061163d5788600481518110151561162e57fe5b90602001906020020151611640565b60005b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016116789190614ba9565b600060405180830381600087803b15801561169257600080fd5b505af11580156116a6573d6000803e3d6000fd5b5050505080925050509695505050505050565b60606000806060600080861415611707576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509450611807565b8593505b600084141515611731578280600101935050600a8481151561172957fe5b04935061170b565b826040519080825280601f01601f1916602001820160405280156117645781602001602082028038833980820191505090505b5091506001830390505b60008614151561180357600a8681151561178457fe5b066030017f0100000000000000000000000000000000000000000000000000000000000000028282806001900393508151811015156117bf57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a868115156117fb57fe5b04955061176e565b8194505b50505050919050565b600760008481526020019081526020016000206000600260016002805490500381548110151561183c57fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff1615156119265760036000848152602001908152602001600020600260016002805490500381548110151561189357fe5b90600052602060002001549080600181540180825580915050906001820390600052602060002001600090919290919091505550600160076000858152602001908152602001600020600060026001600280549050038154811015156118f557fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600260016002805490500381548110151561193d57fe5b906000526020600020015460046000848152602001908152602001600020819055506008600082600281518110151561197257fe5b9060200190","602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060026001600280549050038154811015156119cf57fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff16158015611a485750806002815181101515611a0d57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b15611b925760056000826002815181101515611a6057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002600160028054905003815481101515611abb57fe5b90600052602060002001549080600181540180825580915050906001820390600052602060002001600090919290919091505550600160086000836002815181101515611b0457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002600160028054905003815481101515611b6157fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60096000826003815181101515611ba557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002600160028054905003815481101515611c0257fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff16158015611c7b5750806003815181101515611c4057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b15611dc55760066000826003815181101515611c9357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002600160028054905003815481101515611cee57fe5b90600052602060002001549080600181540180825580915050906001820390600052602060002001600090919290919091505550600160096000836003815181101515611d3757fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002600160028054905003815481101515611d9457fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b505050565b6060600060606000806000806000600280549050604051908082528060200260200182016040528015611e0c5781602001602082028038833980820191505090505b50955060018a51118015611e39575060008a6001815181101515611e2c57fe5b9060200190602002015114155b15611ec7576000600460008c6001815181101515611e5357fe5b90602001906020020151815260200190815260200160002054141515611ec6576001866001600460008e6001815181101515611e8b57fe5b9060200190602002015181526020019081526020016000205403815181101515611eb157fe5b90602001906020020190151590811515815250505b5b60008a51118015611ef1575060008a6000815181101515611ee457fe5b9060200190602002015114155b1561200c57600094505b600360008b6000815181101515611f0e57fe5b9060200190602002015181526020019081526020016000208054905085101561200b57856001600360008d6000815181101515611f4757fe5b90602001906020020151815260200190815260200160002087815481101515611f6c57fe5b906000526020600020015403815181101515611f8457fe5b906020019060200201511515611ffe576001866001600360008e6000815181101515611fac57fe5b90602001906020020151815260200190815260200160002088815481101515611fd157fe5b906000526020600020015403815181101515611fe957fe5b90602001906020020190151590811515815250505b8480600101955050611efb565b5b600089511180156120625750600073ffffffffffffffffffffffffffffffffffffffff1689600081518110151561203f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b1561220157600093505b600560008a600081518110151561207f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905084101561220057856001600560008c60008151811015156120e457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110151561213557fe5b90600052602060002001540381518110151561214d57fe5b9060200190602002015115156121f3576001866001600560008d600081518110151561217557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811015156121c657fe5b9060005260206000200154038151811015156121de57fe5b90602001906020020190151590811515815250505b838060010194505061206c565b5b600189511180156122575750600073ffffffffffffffffffffffffffffffffffffffff1689600181518110151561223457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b156123f657600092505b600660008a600181518110151561227457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508310156123f557856001600660008c60018151811015156122d957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110151561232a57fe5b90600052602060002001540381518110151561234257fe5b9060200190602002015115156123e8576001866001600660008d600181518110151561236a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811015156123bb57fe5b9060005260206000200154038151811015156123d357fe5b90602001906020020190151590811515815250505b8280600101935050612261565b5b60009150600090505b855181101561243b57858181518110151561241657fe5b906020019060200201511561242e5781806001019250505b80806001019150506123ff565b8582975097505050505050509250929050565b60606000806000606060008673ffffffffffffffffffffffffffffffffffffffff16945060008514156124b8576040805190810160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525095506125b8565b8493505b6000841415156124e2578280600101935050600a848115156124da57fe5b0493506124bc565b826040519080825280601f01601f1916602001820160405280156125155781602001602082028038833980820191505090505b5091506001830390505b6000851415156125b457600a8581151561253557fe5b066030017f01000000000000000000000000000000000000000000000000000000000000000282828060019003935081518110151561257057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a858115156125ac57fe5b04945061251f565b8195505b5050505050919050565b6060600080600060606000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f23f63c9600a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016126489190614a4f565b602060405180830381600087803b15801561266257600080fd5b505af1158015612676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061269a919081019061421b565b955060009450896040519080825280602002602001820160405280156126cf5781602001602082028038833980820191505090505b50935060009250600091505b8a518210156128b6578a828151811015156126f257fe5b90602001906020020151156128a9578573ffffffffffffffffffffffffffffffffffffffff1663e8434e39612729600185016116b9565b8b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016127639291906149ef565b602060405180830381600087803b15801561277d57600080fd5b505af1158015612791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127b591908101906141c9565b90508073ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561281b57600080fd5b505af115801561282f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128539190810190614244565b8501945080848480600101955081518110151561286c57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b81806001019250506126db565b838597509750505050505050935093915050565b60608060008060008060006060600c890260405190808252806020026020018201604052801561290e57816020015b60608152602001906001900390816128f95790505b509650600095505b895186101561353457898681518110151561292d57fe5b90602001906020020151945060009350600092505b8473ffffffffffffffffffffffffffffffffffffffff1663949d225d6040518163ffffffff167c0100000000000000000000000000","000000000000000000000000000000028152600401602060405180830381600087803b1580156129a657600080fd5b505af11580156129ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129de9190810190614244565b831215613527578473ffffffffffffffffffffffffffffffffffffffff1663846719e0846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612a3a91906149ab565b602060405180830381600087803b158015612a5457600080fd5b505af1158015612a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a8c91908101906141f2565b915060009350612c938273ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612ae890614bd7565b600060405180830381600087803b158015612b0257600080fd5b505af1158015612b16573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612b3f919081019061426d565b8373ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612b9290614b34565b600060405180830381600087803b158015612bac57600080fd5b505af1158015612bc0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612be9919081019061426d565b8473ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c3c90614c2c565b602060405180830381600087803b158015612c5657600080fd5b505af1158015612c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c8e9190810190614035565b613544565b905060038151141515612cdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd290614b14565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612d2e90614c7a565b600060405180830381600087803b158015612d4857600080fd5b505af1158015612d5c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612d85919081019061426d565b878585600c0201815181101515612d9857fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612df890614cef565b600060405180830381600087803b158015612e1257600080fd5b505af1158015612e26573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612e4f919081019061426d565b878560010195508585600c0201815181101515612e6857fe5b90602001906020020181905250806000815181101515612e8457fe5b90602001906020020151878560010195508585600c0201815181101515612ea757fe5b90602001906020020181905250806001815181101515612ec357fe5b90602001906020020151878560010195508585600c0201815181101515612ee657fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612f4690614e0e565b600060405180830381600087803b158015612f6057600080fd5b505af1158015612f74573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612f9d919081019061426d565b878560010195508585600c0201815181101515612fb657fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161301690614d44565b600060405180830381600087803b15801561303057600080fd5b505af1158015613044573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061306d919081019061426d565b878560010195508585600c020181518110151561308657fe5b906020019060200201819052506131568273ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016130e990614a71565b602060405180830381600087803b15801561310357600080fd5b505af1158015613117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061313b9190810190614035565b73ffffffffffffffffffffffffffffffffffffffff1661244e565b878560010195508585600c020181518110151561316f57fe5b9060200190602002018190525080600281518110151561318b57fe5b90602001906020020151878560010195508585600c02018151811015156131ae57fe5b906020019060200201819052506132688273ffffffffffffffffffffffffffffffffffffffff1663fda69fae6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161321190614ea3565b602060405180830381600087803b15801561322b57600080fd5b505af115801561323f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132639190810190614244565b6116b9565b878560010195508585600c020181518110151561328157fe5b9060200190602002018190525061333b8273ffffffffffffffffffffffffffffffffffffffff1663fda69fae6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016132e490614ef1565b602060405180830381600087803b1580156132fe57600080fd5b505af1158015613312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133369190810190614244565b6116b9565b878560010195508585600c020181518110151561335457fe5b906020019060200201819052506134248273ffffffffffffffffffffffffffffffffffffffff1663bf40fac16040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016133b790614b89565b602060405180830381600087803b1580156133d157600080fd5b505af11580156133e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134099190810190614035565b73ffffffffffffffffffffffffffffffffffffffff1661244e565b878560010195508585600c020181518110151561343d57fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639c981fcb6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161349d90614abf565b600060405180830381600087803b1580156134b757600080fd5b505af11580156134cb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506134f4919081019061426d565b878560010195508585600c020181518110151561350d57fe5b906020019060200201819052508280600101935050612942565b8580600101965050612916565b8697505050505050505092915050565b606080600080600360405190808252806020026020018201604052801561357f57816020015b606081526020019060019003908161356a5790505b50925061358b87613ac9565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151561374557600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346438ca061360789613ac9565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161363f9190614945565b602060405180830381600087803b15801561365957600080fd5b505af115801561366d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136919190810190614035565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151515613705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136fc90614d99565b60405180910390fd5b6137248173ffffffffffffffffffffffffffffffffffffffff1661244e565b83600081518110151561373357fe5b90602001906020020181905250613763565b8683600081518110151561375557fe5b906020019060200201819052505b61376c86613ac9565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151561392657600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166346438ca06137e888613ac9565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016138209190614945565b602060405180830381600087803b15801561383a57600080fd5b505af115801561384e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138729190810190614035565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16141515156138e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138dd90614e83565b60405180910390fd5b6139058173ffffffffffffffffffffffffffffffffffffffff1661244e565b83600181518110151561391457fe5b90602001906020020181905250613944565b8583600181518110151561393657fe5b906020019060200201819052505b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffff","ffffffffff166346438ca0866040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016139bb9190614945565b602060405180830381600087803b1580156139d557600080fd5b505af11580156139e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613a0d9190810190614035565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151515613a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613a7890614ccf565b60405180910390fd5b613aa08173ffffffffffffffffffffffffffffffffffffffff1661244e565b836002815181101515613aaf57fe5b906020019060200201819052508293505050509392505050565b6000606060008084925060009150600090505b8251811015613c8f5760308382815181101515613af557fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1610158015613bf3575060398382815181101515613b7f57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1611155b15613c825760308382815181101515613c0857fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090040360ff16600a83020191505b8080600101915050613adc565b819350505050919050565b6040805190810160405280600290602082028038833980820191505090505090565b6000613cc88235615181565b905092915050565b6000613cdc8251615181565b905092915050565b600082601f8301121515613cf757600080fd5b8135613d0a613d0582614fda565b614fad565b91508181835260208401935060208101905083856020840282011115613d2f57600080fd5b60005b83811015613d5f5781613d458882613cbc565b845260208401935060208301925050600181019050613d32565b5050505092915050565b600082601f8301121515613d7c57600080fd5b8135613d8f613d8a82615002565b614fad565b91508181835260208401935060208101905083856020840282011115613db457600080fd5b60005b83811015613de45781613dca8882613f39565b845260208401935060208301925050600181019050613db7565b5050505092915050565b600082601f8301121515613e0157600080fd5b8135613e14613e0f8261502a565b614fad565b9150818183526020840193506020810190508360005b83811015613e5a5781358601613e408882613f61565b845260208401935060208301925050600181019050613e2a565b5050505092915050565b600082601f8301121515613e7757600080fd5b8135613e8a613e8582615052565b614fad565b91508181835260208401935060208101905083856020840282011115613eaf57600080fd5b60005b83811015613edf5781613ec5888261400d565b845260208401935060208301925050600181019050613eb2565b5050505092915050565b6000613ef582516151a1565b905092915050565b6000613f0982516151b3565b905092915050565b6000613f1d82516151c5565b905092915050565b6000613f3182516151d7565b905092915050565b6000613f4582356151e9565b905092915050565b6000613f5982516151e9565b905092915050565b600082601f8301121515613f7457600080fd5b8135613f87613f828261507a565b614fad565b91508082526020830160208301858383011115613fa357600080fd5b613fae838284615221565b50505092915050565b600082601f8301121515613fca57600080fd5b8151613fdd613fd8826150a6565b614fad565b91508082526020830160208301858383011115613ff957600080fd5b614004838284615230565b50505092915050565b600061401982356151f3565b905092915050565b600061402d82516151f3565b905092915050565b60006020828403121561404757600080fd5b600061405584828501613cd0565b91505092915050565b6000806000806080858703121561407457600080fd5b600085013567ffffffffffffffff81111561408e57600080fd5b61409a87828801613ce4565b94505060206140ab8782880161400d565b935050604085013567ffffffffffffffff8111156140c857600080fd5b6140d487828801613dee565b925050606085013567ffffffffffffffff8111156140f157600080fd5b6140fd87828801613d69565b91505092959194509250565b60008060006060848603121561411e57600080fd5b600084013567ffffffffffffffff81111561413857600080fd5b61414486828701613e64565b935050602084013567ffffffffffffffff81111561416157600080fd5b61416d86828701613ce4565b925050604084013567ffffffffffffffff81111561418a57600080fd5b61419686828701613d69565b9150509250925092565b6000602082840312156141b257600080fd5b60006141c084828501613ee9565b91505092915050565b6000602082840312156141db57600080fd5b60006141e984828501613efd565b91505092915050565b60006020828403121561420457600080fd5b600061421284828501613f11565b91505092915050565b60006020828403121561422d57600080fd5b600061423b84828501613f25565b91505092915050565b60006020828403121561425657600080fd5b600061426484828501613f4d565b91505092915050565b60006020828403121561427f57600080fd5b600082015167ffffffffffffffff81111561429957600080fd5b6142a584828501613fb7565b91505092915050565b6000602082840312156142c057600080fd5b60006142ce84828501614021565b91505092915050565b600080604083850312156142ea57600080fd5b60006142f885828601614021565b925050602083015167ffffffffffffffff81111561431557600080fd5b61432185828601613fb7565b9150509250929050565b61433481615141565b82525050565b6000614345826150fb565b8084526020840193508360208202850161435e856150d2565b60005b84811015614397578383038852614379838351614465565b925061438482615127565b9150602088019750600181019050614361565b508196508694505050505092915050565b6143b181615106565b6143ba826150df565b60005b828110156143ec576143d0858351614936565b6143d982615134565b91506020850194506001810190506143bd565b5050505050565b6143fc81615161565b82525050565b61440b816151fd565b82525050565b61441a8161520f565b82525050565b6144298161516d565b82525050565b600061443a8261511c565b80845261444e816020860160208601615230565b61445781615263565b602085010191505092915050565b600061447082615111565b808452614484816020860160208601615230565b61448d81615263565b602085010191505092915050565b6000815460018116600081146144b857600181146144d857614519565b607f600283041680865260ff198316602087015260408601935050614519565b600282048086526020860195506144ee856150e9565b60005b82811015614510578154818901526001820191506020810190506144f1565b80880195505050505b505092915050565b6000600582527f61737365740000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600782527f7375626a656374000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601282527f6163636f756e74206e6f742076657269667900000000000000000000000000006020830152604082019050919050565b6000600282527f746f0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600d82527f72656c617465645f6173736574000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f66726f6d000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600882527f6f70657261746f720000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600782527f7465726d5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601a82527f6f70657261746f72206163636f756e74206e6f7420666f756e640000000000006020830152604082019050919050565b6000600382527f73657100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f64657363000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601682527f66726f6d206163636f756e74206e6f7420666f756e64000000000000000000006020830152604082019050919050565b6000601882527f506172616d73206973206e6f7420636f6d706c69616e636500000000000000006020830152604082019050919050565b6000600782527f626f6f6b5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600682527f616d6f756e7400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601182527f777269746520626f6f6b206661696c65640000000000000000000000000000006020830152604082019050919050565b6000601482527f746f206163636f756e74206e6f7420666f756e640000000000000000000000006020830152604082019050919050565b6000601082527f7472616e73616374696f6e5f74797065000000000000000000000000000000006020830152604082019050919050565b6000600e82527f6f7065726174696f6e5f747970650000000000000000000000000000000000006020830152604082019050919050565b61493f81615177565b82525050565b600060208201905061495a600083018461432b565b92915050565b6000602082019050818103600083015261497a81846143","3a565b905092915050565b600060608201905061499760008301856143f3565b6149a460208301846143a8565b9392505050565b60006020820190506149c06000830184614420565b92915050565b60006040820190506149db6000830185614420565b6149e86020830184614420565b9392505050565b60006040820190508181036000830152614a09818561442f565b9050614a186020830184614402565b9392505050565b60006040820190508181036000830152614a39818561442f565b9050614a486020830184614411565b9392505050565b60006020820190508181036000830152614a69818461449b565b905092915050565b60006020820190508181036000830152614a8a81614521565b9050919050565b60006040820190508181036000830152614aaa81614521565b9050614ab9602083018461432b565b92915050565b60006020820190508181036000830152614ad881614558565b9050919050565b60006040820190508181036000830152614af881614558565b90508181036020830152614b0c8184614465565b905092915050565b60006020820190508181036000830152614b2d8161458f565b9050919050565b60006020820190508181036000830152614b4d816145c6565b9050919050565b60006040820190508181036000830152614b6d816145c6565b90508181036020830152614b81818461442f565b905092915050565b60006020820190508181036000830152614ba2816145fd565b9050919050565b60006040820190508181036000830152614bc2816145fd565b9050614bd1602083018461432b565b92915050565b60006020820190508181036000830152614bf081614634565b9050919050565b60006040820190508181036000830152614c1081614634565b90508181036020830152614c24818461442f565b905092915050565b60006020820190508181036000830152614c458161466b565b9050919050565b60006040820190508181036000830152614c658161466b565b9050614c74602083018461432b565b92915050565b60006020820190508181036000830152614c93816146a2565b9050919050565b60006040820190508181036000830152614cb3816146a2565b90508181036020830152614cc7818461442f565b905092915050565b60006020820190508181036000830152614ce8816146d9565b9050919050565b60006020820190508181036000830152614d0881614710565b9050919050565b60006040820190508181036000830152614d2881614710565b90508181036020830152614d3c818461442f565b905092915050565b60006020820190508181036000830152614d5d81614747565b9050919050565b60006040820190508181036000830152614d7d81614747565b90508181036020830152614d918184614465565b905092915050565b60006020820190508181036000830152614db28161477e565b9050919050565b60006020820190508181036000830152614dd2816147b5565b9050919050565b60006040820190508181036000830152614df2816147ec565b90508181036020830152614e06818461442f565b905092915050565b60006020820190508181036000830152614e2781614823565b9050919050565b60006040820190508181036000830152614e4781614823565b90508181036020830152614e5b818461442f565b905092915050565b60006020820190508181036000830152614e7c8161485a565b9050919050565b60006020820190508181036000830152614e9c81614891565b9050919050565b60006020820190508181036000830152614ebc816148c8565b9050919050565b60006040820190508181036000830152614edc816148c8565b9050614eeb6020830184614420565b92915050565b60006020820190508181036000830152614f0a816148ff565b9050919050565b60006040820190508181036000830152614f2a816148ff565b9050614f396020830184614420565b92915050565b6000602082019050614f546000830184614936565b92915050565b600060a082019050614f6f6000830188614936565b614f7c6020830187614936565b614f89604083018661432b565b614f96606083018561432b565b614fa36080830184614936565b9695505050505050565b6000604051905081810181811067ffffffffffffffff82111715614fd057600080fd5b8060405250919050565b600067ffffffffffffffff821115614ff157600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561501957600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561504157600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561506957600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561509157600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156150bd57600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b6000819050919050565b60008160005260206000209050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006151ac82615141565b9050919050565b60006151be82615141565b9050919050565b60006151d082615141565b9050919050565b60006151e282615141565b9050919050565b6000819050919050565b6000819050919050565b600061520882615141565b9050919050565b600061521a82615141565b9050919050565b82818337600083830152505050565b60005b8381101561524e578082015181840152602081019050615233565b8381111561525d576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a7230582086bfd4b64c65a4c8b35aa4ebf3dac67a9e761986cff3744c3f2fb9884a43b0b06c6578706572696d656e74616cf50037"};

    public static final String BINARY = String.join("", BINARY_ARRAY);

    public static final String[] SM_BINARY_ARRAY = {"60806040523480156200001157600080fd5b506040516200593638038062005936833981018060405262000037919081019062000354565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260019080600181540180825580915050906001820390600052602060002001600090919290919091505550611001600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600a9080519060200190620000ff9291906200021b565b50600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c92a7801600a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016200017a91906200055d565b602060405180830381600087803b1580156200019557600080fd5b505af1158015620001aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620001d09190810190620003c3565b5080600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000678565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200025e57805160ff19168380011785556200028f565b828001600101855582156200028f579182015b828111156200028e57825182559160200191906001019062000271565b5b5090506200029e9190620002a2565b5090565b620002c791905b80821115620002c3576000816000905550600101620002a9565b5090565b90565b6000620002d8825162000618565b905092915050565b6000620002ee825162000638565b905092915050565b600082601f83011215156200030a57600080fd5b8151620003216200031b82620005d9565b620005ab565b915080825260208301602083018583830111156200033e57600080fd5b6200034b83828462000642565b50505092915050565b6000806000606084860312156200036a57600080fd5b60006200037a86828701620002ca565b935050602084015167ffffffffffffffff8111156200039857600080fd5b620003a686828701620002f6565b9250506040620003b986828701620002ca565b9150509250925092565b600060208284031215620003d657600080fd5b6000620003e684828501620002e0565b91505092915050565b6000815460018116600081146200040f5760018114620004305762000475565b607f600283041680865260ff19831660208701526040860193505062000475565b60028204808652602086019550620004488562000606565b60005b828110156200046c578154818901526001820191506020810190506200044b565b80880195505050505b505092915050565b6000600782527f626f6f6b5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000606482527f7465726d5f6e6f2c7365712c66726f6d2c746f2c616d6f756e742c617373657460208301527f2c6f70657261746f722c646573632c7472616e73616374696f6e5f747970652c60408301527f6f7065726174696f6e5f747970652c7375626a6563742c72656c617465645f6160608301527f7373657400000000000000000000000000000000000000000000000000000000608083015260a082019050919050565b60006060820190508181036000830152620005798184620003ef565b905081810360208301526200058e816200047d565b90508181036040830152620005a381620004b4565b905092915050565b6000604051905081810181811067ffffffffffffffff82111715620005cf57600080fd5b8060405250919050565b600067ffffffffffffffff821115620005f157600080fd5b601f19601f8301169050602081019050919050565b60008160005260206000209050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200066257808201518184015260208101905062000645565b8381111562000672576000848401525b50505050565b6152ae80620006886000396000f300608060405260043610610062576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806311567c421461006757806318768d1e1461009257806345be589e146100d0578063b32cf81b146100fb575b600080fd5b34801561007357600080fd5b5061007c610138565b6040516100899190614945565b60405180910390f35b34801561009e57600080fd5b506100b960048036036100b4919081019061405e565b610140565b6040516100c7929190614982565b60405180910390f35b3480156100dc57600080fd5b506100e56105d1565b6040516100f29190614f3f565b60405180910390f35b34801561010757600080fd5b50610122600480360361011d9190810190614109565b61062e565b60405161012f9190614960565b60405180910390f35b600030905090565b600061014a613c9a565b60006060600080600061015b613c9a565b60048c511015801561016e575060028951145b15156101af576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016101a690614d6b565b60405180910390fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631bf727356040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401600060405180830381600087803b15801561023457600080fd5b505af1158015610248573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061027191908101906142d7565b80965081975050506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bd332ffe6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156102fe57600080fd5b505af1158015610312573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061033691908101906142ae565b935061034686858e8e8e8e610cef565b9250600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166359a48b65600a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016103c09190614a4f565b602060405180830381600087803b1580156103da57600080fd5b505af11580156103ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610412919081019061421b565b915060018273ffffffffffffffffffffffffffffffffffffffff16634c6f30c061045c600260016002805490500381548110151561044c57fe5b90600052602060002001546116b9565b866040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610496929190614a1f565b602060405180830381600087803b1580156104b057600080fd5b505af11580156104c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506104e89190810190614244565b14151561052a576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161052190614bfe565b60405180910390fd5b61053586858e611810565b60408051908101604052808781526020018581525090507f370fc1741645a856379d1c2be6c9f567fa67f594a8b02fa03d83b70ebe8958dc86858e600281518110151561057e57fe5b906020019060200201518f600381518110151561059757fe5b906020019060200201518f6040516105b3959493929190614f5a565b60405180910390a16001819750975050505050505094509492505050565b600060026001600280549050019080600181540180825580915050906001820390600052602060002001600090919290919091505550600260016002805490500381548110151561061e57fe5b9060005260206000200154905090565b60606000606060006060600080606060008b51118061064e575060008a51115b151561068f576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040161068690614d6b565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166359a48b65600a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016107079190614a4f565b602060405180830381600087803b15801561072157600080fd5b505af1158015610735573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610759919081019061421b565b96506107658b8b611dca565b80965081975050508673ffffffffffffffffffffffffffffffffffffffff1663c74f8caf6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156107d157600080fd5b505af11580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061080991908101906141a0565b92506000915060008b51118015610839575060008b600081518110151561082c57fe5b9060200190602002015114155b156108e6578273ffffffffffffffffffffffffffffffffffffffff1663ae763db561087b8d600081518110151561086c57fe5b906020019060200201516116b9565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016108b39190614d36565b600060405180830381600087803b1580156108cd57600080fd5b505af11580156108e1573d6000803e3d6000fd5b505050505b60018b51118015610910575060008b600181518110151561090357fe5b9060200190602002015114155b156109bd578273ffffffffffffffffffffffffffffffffffffffff1663ae763db56109528d600181518110151561094357fe5b906020019060200201516116b9565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000","00000002815260040161098a9190614b74565b600060405180830381600087803b1580156109a457600080fd5b505af11580156109b8573d6000803e3d6000fd5b505050505b60008a51118015610a135750600073ffffffffffffffffffffffffffffffffffffffff168a60008151811015156109f057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610ad6578273ffffffffffffffffffffffffffffffffffffffff1663ae763db5610a6b8c6000815181101515610a4657fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1661244e565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610aa39190614bc9565b600060405180830381600087803b158015610abd57600080fd5b505af1158015610ad1573d6000803e3d6000fd5b505050505b60018a51118015610b2c5750600073ffffffffffffffffffffffffffffffffffffffff168a6001815181101515610b0957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610bef578273ffffffffffffffffffffffffffffffffffffffff1663ae763db5610b848c6001815181101515610b5f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1661244e565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610bbc9190614eb5565b600060405180830381600087803b158015610bd657600080fd5b505af1158015610bea573d6000803e3d6000fd5b505050505b8273ffffffffffffffffffffffffffffffffffffffff1663324927378a6000815181101515610c1a57fe5b906020019060200201518b6001815181101515610c3357fe5b906020019060200201516040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610c769291906149c6565b600060405180830381600087803b158015610c9057600080fd5b505af1158015610ca4573d6000803e3d6000fd5b50505050610cb38686856125c2565b809350819250505060008151118015610ccc5750600082135b15610cde57610cdb81836128ca565b93505b839750505050505050509392505050565b6000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166359a48b65600a6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610d6c9190614a4f565b602060405180830381600087803b158015610d8657600080fd5b505af1158015610d9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dbe919081019061421b565b91508173ffffffffffffffffffffffffffffffffffffffff16635887ab246040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015610e2457600080fd5b505af1158015610e38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610e5c91908101906141f2565b90508073ffffffffffffffffffffffffffffffffffffffff16631a391cb4610ea46002600160028054905003815481101515610e9457fe5b90600052602060002001546116b9565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610edc9190614ce1565b600060405180830381600087803b158015610ef657600080fd5b505af1158015610f0a573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb4610f338a6116b9565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610f6b9190614b74565b600060405180830381600087803b158015610f8557600080fd5b505af1158015610f99573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb4610fc28b6116b9565b6040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401610ffa9190614d36565b600060405180830381600087803b15801561101457600080fd5b505af1158015611028573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb461107f89600281518110151561105a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1661244e565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016110b79190614bc9565b600060405180830381600087803b1580156110d157600080fd5b505af11580156110e5573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb461113c89600381518110151561111757fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1661244e565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016111749190614eb5565b600060405180830381600087803b15801561118e57600080fd5b505af11580156111a2573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663517c4dd98860018151811015156111d157fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016112139190614c93565b600060405180830381600087803b15801561122d57600080fd5b505af1158015611241573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb461126a886116b9565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016112a29190614c3e565b600060405180830381600087803b1580156112bc57600080fd5b505af11580156112d0573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663517c4dd98860008151811015156112ff57fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016113419190614b06565b600060405180830381600087803b15801561135b57600080fd5b505af115801561136f573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16631a391cb486600081518110151561139e57fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016113e09190614ab1565b600060405180830381600087803b1580156113fa57600080fd5b505af115801561140e573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def4269885600081518110151561143d57fe5b906020019060200201516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161147f9190614dab565b600060405180830381600087803b15801561149957600080fd5b505af11580156114ad573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1663def426988560018151811015156114dc57fe5b906020019060200201516040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161151e9190614df9565b600060405180830381600087803b15801561153857600080fd5b505af115801561154c573d6000803e3d6000fd5b505050506001855111156115fa578073ffffffffffffffffffffffffffffffffffffffff16631a391cb486600181518110151561158557fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016115c79190614f0a565b600060405180830381600087803b1580156115e157600080fd5b505af11580156115f5573d6000803e3d6000fd5b505050505b8073ffffffffffffffffffffffffffffffffffffffff1663517c4dd9600589511061163d5788600481518110151561162e57fe5b90602001906020020151611640565b60005b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016116789190614e47565b600060405180830381600087803b15801561169257600080fd5b505af11580156116a6573d6000803e3d6000fd5b5050505080925050509695505050505050565b60606000806060600080861415611707576040805190810160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509450611807565b8593505b600084141515611731578280600101935050600a8481151561172957fe5b04935061170b565b826040519080825280601f01601f1916602001820160405280156117645781602001602082028038833980820191505090505b5091506001830390505b60008614151561180357600a8681151561178457fe5b066030017f0100000000000000000000000000000000000000000000000000000000000000028282806001900393508151811015156117bf57fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a868115156117fb57fe5b04955061176e565b8194505b50505050919050565b600760008481526020019081526020016000206000600260016002805490500381548110151561183c57fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff1615156119265760036000848152602001908152602001600020600260016002805490500381548110151561189357fe5b90600052602060002001549080600181540180825580915050906001820390600052602060002001600090919290919091505550600160076000858152602001908152602001600020600060026001600280549050038154811015156118f557fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b600260016002805490500381548110151561193d57fe5b906000526020600020015460046000848152602001908152602001600020819055506008600082600281518110151561197257fe5b9060200190","602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600060026001600280549050038154811015156119cf57fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff16158015611a485750806002815181101515611a0d57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b15611b925760056000826002815181101515611a6057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002600160028054905003815481101515611abb57fe5b90600052602060002001549080600181540180825580915050906001820390600052602060002001600090919290919091505550600160086000836002815181101515611b0457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002600160028054905003815481101515611b6157fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60096000826003815181101515611ba557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002600160028054905003815481101515611c0257fe5b9060005260206000200154815260200190815260200160002060009054906101000a900460ff16158015611c7b5750806003815181101515611c4057fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614155b15611dc55760066000826003815181101515611c9357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002600160028054905003815481101515611cee57fe5b90600052602060002001549080600181540180825580915050906001820390600052602060002001600090919290919091505550600160096000836003815181101515611d3757fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006002600160028054905003815481101515611d9457fe5b9060005260206000200154815260200190815260200160002060006101000a81548160ff0219169083151502179055505b505050565b6060600060606000806000806000600280549050604051908082528060200260200182016040528015611e0c5781602001602082028038833980820191505090505b50955060018a51118015611e39575060008a6001815181101515611e2c57fe5b9060200190602002015114155b15611ec7576000600460008c6001815181101515611e5357fe5b90602001906020020151815260200190815260200160002054141515611ec6576001866001600460008e6001815181101515611e8b57fe5b9060200190602002015181526020019081526020016000205403815181101515611eb157fe5b90602001906020020190151590811515815250505b5b60008a51118015611ef1575060008a6000815181101515611ee457fe5b9060200190602002015114155b1561200c57600094505b600360008b6000815181101515611f0e57fe5b9060200190602002015181526020019081526020016000208054905085101561200b57856001600360008d6000815181101515611f4757fe5b90602001906020020151815260200190815260200160002087815481101515611f6c57fe5b906000526020600020015403815181101515611f8457fe5b906020019060200201511515611ffe576001866001600360008e6000815181101515611fac57fe5b90602001906020020151815260200190815260200160002088815481101515611fd157fe5b906000526020600020015403815181101515611fe957fe5b90602001906020020190151590811515815250505b8480600101955050611efb565b5b600089511180156120625750600073ffffffffffffffffffffffffffffffffffffffff1689600081518110151561203f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b1561220157600093505b600560008a600081518110151561207f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905084101561220057856001600560008c60008151811015156120e457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208681548110151561213557fe5b90600052602060002001540381518110151561214d57fe5b9060200190602002015115156121f3576001866001600560008d600081518110151561217557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020878154811015156121c657fe5b9060005260206000200154038151811015156121de57fe5b90602001906020020190151590811515815250505b838060010194505061206c565b5b600189511180156122575750600073ffffffffffffffffffffffffffffffffffffffff1689600181518110151561223457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b156123f657600092505b600660008a600181518110151561227457fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508310156123f557856001600660008c60018151811015156122d957fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208581548110151561232a57fe5b90600052602060002001540381518110151561234257fe5b9060200190602002015115156123e8576001866001600660008d600181518110151561236a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020868154811015156123bb57fe5b9060005260206000200154038151811015156123d357fe5b90602001906020020190151590811515815250505b8280600101935050612261565b5b60009150600090505b855181101561243b57858181518110151561241657fe5b906020019060200201511561242e5781806001019250505b80806001019150506123ff565b8582975097505050505050509250929050565b60606000806000606060008673ffffffffffffffffffffffffffffffffffffffff16945060008514156124b8576040805190810160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525095506125b8565b8493505b6000841415156124e2578280600101935050600a848115156124da57fe5b0493506124bc565b826040519080825280601f01601f1916602001820160405280156125155781602001602082028038833980820191505090505b5091506001830390505b6000851415156125b457600a8581151561253557fe5b066030017f01000000000000000000000000000000000000000000000000000000000000000282828060019003935081518110151561257057fe5b9060200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a858115156125ac57fe5b04945061251f565b8195505b5050505050919050565b6060600080600060606000806000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166359a48b65600a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016126489190614a4f565b602060405180830381600087803b15801561266257600080fd5b505af1158015612676573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061269a919081019061421b565b955060009450896040519080825280602002602001820160405280156126cf5781602001602082028038833980820191505090505b50935060009250600091505b8a518210156128b6578a828151811015156126f257fe5b90602001906020020151156128a9578573ffffffffffffffffffffffffffffffffffffffff1663d8ac5957612729600185016116b9565b8b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016127639291906149ef565b602060405180830381600087803b15801561277d57600080fd5b505af1158015612791573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127b591908101906141c9565b90508073ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561281b57600080fd5b505af115801561282f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506128539190810190614244565b8501945080848480600101955081518110151561286c57fe5b9060200190602002019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b81806001019250506126db565b838597509750505050505050935093915050565b60608060008060008060006060600c890260405190808252806020026020018201604052801561290e57816020015b60608152602001906001900390816128f95790505b509650600095505b895186101561353457898681518110151561292d57fe5b90602001906020020151945060009350600092505b8473ffffffffffffffffffffffffffffffffffffffff1663d3e9af5a6040518163ffffffff167c0100000000000000000000000000","000000000000000000000000000000028152600401602060405180830381600087803b1580156129a657600080fd5b505af11580156129ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129de9190810190614244565b831215613527578473ffffffffffffffffffffffffffffffffffffffff16633dd2b614846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612a3a91906149ab565b602060405180830381600087803b158015612a5457600080fd5b505af1158015612a68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a8c91908101906141f2565b915060009350612c938273ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612ae890614ba9565b600060405180830381600087803b158015612b0257600080fd5b505af1158015612b16573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612b3f919081019061426d565b8373ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612b9290614e95565b600060405180830381600087803b158015612bac57600080fd5b505af1158015612bc0573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612be9919081019061426d565b8473ffffffffffffffffffffffffffffffffffffffff166307afbf3a6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612c3c90614ae6565b602060405180830381600087803b158015612c5657600080fd5b505af1158015612c6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612c8e9190810190614035565b613544565b905060038151141515612cdb576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401612cd290614a71565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612d2e90614d16565b600060405180830381600087803b158015612d4857600080fd5b505af1158015612d5c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612d85919081019061426d565b878585600c0201815181101515612d9857fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612df890614b54565b600060405180830381600087803b158015612e1257600080fd5b505af1158015612e26573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612e4f919081019061426d565b878560010195508585600c0201815181101515612e6857fe5b90602001906020020181905250806000815181101515612e8457fe5b90602001906020020151878560010195508585600c0201815181101515612ea757fe5b90602001906020020181905250806001815181101515612ec357fe5b90602001906020020151878560010195508585600c0201815181101515612ee657fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401612f4690614c1e565b600060405180830381600087803b158015612f6057600080fd5b505af1158015612f74573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250612f9d919081019061426d565b878560010195508585600c0201815181101515612fb657fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161301690614a91565b600060405180830381600087803b15801561303057600080fd5b505af1158015613044573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061306d919081019061426d565b878560010195508585600c020181518110151561308657fe5b906020019060200201819052506131568273ffffffffffffffffffffffffffffffffffffffff166307afbf3a6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016130e990614c73565b602060405180830381600087803b15801561310357600080fd5b505af1158015613117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061313b9190810190614035565b73ffffffffffffffffffffffffffffffffffffffff1661244e565b878560010195508585600c020181518110151561316f57fe5b9060200190602002018190525080600281518110151561318b57fe5b90602001906020020151878560010195508585600c02018151811015156131ae57fe5b906020019060200201819052506132688273ffffffffffffffffffffffffffffffffffffffff16634900862e6040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161321190614d8b565b602060405180830381600087803b15801561322b57600080fd5b505af115801561323f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506132639190810190614244565b6116b9565b878560010195508585600c020181518110151561328157fe5b9060200190602002018190525061333b8273ffffffffffffffffffffffffffffffffffffffff16634900862e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016132e490614dd9565b602060405180830381600087803b1580156132fe57600080fd5b505af1158015613312573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506133369190810190614244565b6116b9565b878560010195508585600c020181518110151561335457fe5b906020019060200201819052506134248273ffffffffffffffffffffffffffffffffffffffff166307afbf3a6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016133b790614e27565b602060405180830381600087803b1580156133d157600080fd5b505af11580156133e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506134099190810190614035565b73ffffffffffffffffffffffffffffffffffffffff1661244e565b878560010195508585600c020181518110151561343d57fe5b906020019060200201819052508173ffffffffffffffffffffffffffffffffffffffff16639bca41e86040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161349d90614eea565b600060405180830381600087803b1580156134b757600080fd5b505af11580156134cb573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506134f4919081019061426d565b878560010195508585600c020181518110151561350d57fe5b906020019060200201819052508280600101935050612942565b8580600101965050612916565b8697505050505050505092915050565b606080600080600360405190808252806020026020018201604052801561357f57816020015b606081526020019060019003908161356a5790505b50925061358b87613ac9565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151561374557600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4dcade661360789613ac9565b6040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040161363f9190614945565b602060405180830381600087803b15801561365957600080fd5b505af115801561366d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506136919190810190614035565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151515613705576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016136fc90614cc1565b60405180910390fd5b6137248173ffffffffffffffffffffffffffffffffffffffff1661244e565b83600081518110151561373357fe5b90602001906020020181905250613763565b8683600081518110151561375557fe5b906020019060200201819052505b61376c86613ac9565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151561392657600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c4dcade66137e888613ac9565b6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016138209190614945565b602060405180830381600087803b15801561383a57600080fd5b505af115801561384e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506138729190810190614035565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16141515156138e6576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004016138dd90614b34565b60405180910390fd5b6139058173ffffffffffffffffffffffffffffffffffffffff1661244e565b83600181518110151561391457fe5b90602001906020020181905250613944565b8583600181518110151561393657fe5b906020019060200201819052505b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffff","ffffffffff1663c4dcade6866040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004016139bb9190614945565b602060405180830381600087803b1580156139d557600080fd5b505af11580156139e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250613a0d9190810190614035565b90508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff1614151515613a81576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401613a7890614e75565b60405180910390fd5b613aa08173ffffffffffffffffffffffffffffffffffffffff1661244e565b836002815181101515613aaf57fe5b906020019060200201819052508293505050509392505050565b6000606060008084925060009150600090505b8251811015613c8f5760308382815181101515613af557fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1610158015613bf3575060398382815181101515613b7f57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f0100000000000000000000000000000000000000000000000000000000000000900460ff1611155b15613c825760308382815181101515613c0857fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f010000000000000000000000000000000000000000000000000000000000000090040360ff16600a83020191505b8080600101915050613adc565b819350505050919050565b6040805190810160405280600290602082028038833980820191505090505090565b6000613cc88235615181565b905092915050565b6000613cdc8251615181565b905092915050565b600082601f8301121515613cf757600080fd5b8135613d0a613d0582614fda565b614fad565b91508181835260208401935060208101905083856020840282011115613d2f57600080fd5b60005b83811015613d5f5781613d458882613cbc565b845260208401935060208301925050600181019050613d32565b5050505092915050565b600082601f8301121515613d7c57600080fd5b8135613d8f613d8a82615002565b614fad565b91508181835260208401935060208101905083856020840282011115613db457600080fd5b60005b83811015613de45781613dca8882613f39565b845260208401935060208301925050600181019050613db7565b5050505092915050565b600082601f8301121515613e0157600080fd5b8135613e14613e0f8261502a565b614fad565b9150818183526020840193506020810190508360005b83811015613e5a5781358601613e408882613f61565b845260208401935060208301925050600181019050613e2a565b5050505092915050565b600082601f8301121515613e7757600080fd5b8135613e8a613e8582615052565b614fad565b91508181835260208401935060208101905083856020840282011115613eaf57600080fd5b60005b83811015613edf5781613ec5888261400d565b845260208401935060208301925050600181019050613eb2565b5050505092915050565b6000613ef582516151a1565b905092915050565b6000613f0982516151b3565b905092915050565b6000613f1d82516151c5565b905092915050565b6000613f3182516151d7565b905092915050565b6000613f4582356151e9565b905092915050565b6000613f5982516151e9565b905092915050565b600082601f8301121515613f7457600080fd5b8135613f87613f828261507a565b614fad565b91508082526020830160208301858383011115613fa357600080fd5b613fae838284615221565b50505092915050565b600082601f8301121515613fca57600080fd5b8151613fdd613fd8826150a6565b614fad565b91508082526020830160208301858383011115613ff957600080fd5b614004838284615230565b50505092915050565b600061401982356151f3565b905092915050565b600061402d82516151f3565b905092915050565b60006020828403121561404757600080fd5b600061405584828501613cd0565b91505092915050565b6000806000806080858703121561407457600080fd5b600085013567ffffffffffffffff81111561408e57600080fd5b61409a87828801613ce4565b94505060206140ab8782880161400d565b935050604085013567ffffffffffffffff8111156140c857600080fd5b6140d487828801613dee565b925050606085013567ffffffffffffffff8111156140f157600080fd5b6140fd87828801613d69565b91505092959194509250565b60008060006060848603121561411e57600080fd5b600084013567ffffffffffffffff81111561413857600080fd5b61414486828701613e64565b935050602084013567ffffffffffffffff81111561416157600080fd5b61416d86828701613ce4565b925050604084013567ffffffffffffffff81111561418a57600080fd5b61419686828701613d69565b9150509250925092565b6000602082840312156141b257600080fd5b60006141c084828501613ee9565b91505092915050565b6000602082840312156141db57600080fd5b60006141e984828501613efd565b91505092915050565b60006020828403121561420457600080fd5b600061421284828501613f11565b91505092915050565b60006020828403121561422d57600080fd5b600061423b84828501613f25565b91505092915050565b60006020828403121561425657600080fd5b600061426484828501613f4d565b91505092915050565b60006020828403121561427f57600080fd5b600082015167ffffffffffffffff81111561429957600080fd5b6142a584828501613fb7565b91505092915050565b6000602082840312156142c057600080fd5b60006142ce84828501614021565b91505092915050565b600080604083850312156142ea57600080fd5b60006142f885828601614021565b925050602083015167ffffffffffffffff81111561431557600080fd5b61432185828601613fb7565b9150509250929050565b61433481615141565b82525050565b6000614345826150fb565b8084526020840193508360208202850161435e856150d2565b60005b84811015614397578383038852614379838351614465565b925061438482615127565b9150602088019750600181019050614361565b508196508694505050505092915050565b6143b181615106565b6143ba826150df565b60005b828110156143ec576143d0858351614936565b6143d982615134565b91506020850194506001810190506143bd565b5050505050565b6143fc81615161565b82525050565b61440b816151fd565b82525050565b61441a8161520f565b82525050565b6144298161516d565b82525050565b600061443a8261511c565b80845261444e816020860160208601615230565b61445781615263565b602085010191505092915050565b600061447082615111565b808452614484816020860160208601615230565b61448d81615263565b602085010191505092915050565b6000815460018116600081146144b857600181146144d857614519565b607f600283041680865260ff198316602087015260408601935050614519565b600282048086526020860195506144ee856150e9565b60005b82811015614510578154818901526001820191506020810190506144f1565b80880195505050505b505092915050565b6000601282527f6163636f756e74206e6f742076657269667900000000000000000000000000006020830152604082019050919050565b6000600482527f64657363000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600882527f6f70657261746f720000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601482527f746f206163636f756e74206e6f7420666f756e640000000000000000000000006020830152604082019050919050565b6000600382527f73657100000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600482527f66726f6d000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601182527f777269746520626f6f6b206661696c65640000000000000000000000000000006020830152604082019050919050565b6000600682527f616d6f756e7400000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600582527f61737365740000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601682527f66726f6d206163636f756e74206e6f7420666f756e64000000000000000000006020830152604082019050919050565b6000600782527f626f6f6b5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600782527f7465726d5f6e6f000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000601882527f506172616d73206973206e6f7420636f6d706c69616e636500000000000000006020830152604082019050919050565b6000601082527f7472616e73616374696f6e5f74797065000000000000000000000000000000006020830152604082019050919050565b6000600e82527f6f7065726174696f6e5f747970650000000000000000000000000000000000006020830152604082019050919050565b6000600d82527f72656c617465645f6173736574000000000000000000000000000000000000006020830152604082019050919050565b6000601a82527f6f70657261746f72206163636f756e74206e6f7420666f756e640000000000006020830152604082019050919050565b6000600282527f746f0000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000600782527f7375626a656374000000000000000000000000000000000000000000000000006020830152604082019050919050565b61493f81615177565b82525050565b600060208201905061495a600083018461432b565b92915050565b6000602082019050818103600083015261497a81846143","3a565b905092915050565b600060608201905061499760008301856143f3565b6149a460208301846143a8565b9392505050565b60006020820190506149c06000830184614420565b92915050565b60006040820190506149db6000830185614420565b6149e86020830184614420565b9392505050565b60006040820190508181036000830152614a09818561442f565b9050614a186020830184614402565b9392505050565b60006040820190508181036000830152614a39818561442f565b9050614a486020830184614411565b9392505050565b60006020820190508181036000830152614a69818461449b565b905092915050565b60006020820190508181036000830152614a8a81614521565b9050919050565b60006020820190508181036000830152614aaa81614558565b9050919050565b60006040820190508181036000830152614aca81614558565b90508181036020830152614ade8184614465565b905092915050565b60006020820190508181036000830152614aff8161458f565b9050919050565b60006040820190508181036000830152614b1f8161458f565b9050614b2e602083018461432b565b92915050565b60006020820190508181036000830152614b4d816145c6565b9050919050565b60006020820190508181036000830152614b6d816145fd565b9050919050565b60006040820190508181036000830152614b8d816145fd565b90508181036020830152614ba1818461442f565b905092915050565b60006020820190508181036000830152614bc281614634565b9050919050565b60006040820190508181036000830152614be281614634565b90508181036020830152614bf6818461442f565b905092915050565b60006020820190508181036000830152614c178161466b565b9050919050565b60006020820190508181036000830152614c37816146a2565b9050919050565b60006040820190508181036000830152614c57816146a2565b90508181036020830152614c6b818461442f565b905092915050565b60006020820190508181036000830152614c8c816146d9565b9050919050565b60006040820190508181036000830152614cac816146d9565b9050614cbb602083018461432b565b92915050565b60006020820190508181036000830152614cda81614710565b9050919050565b60006040820190508181036000830152614cfa81614747565b90508181036020830152614d0e818461442f565b905092915050565b60006020820190508181036000830152614d2f8161477e565b9050919050565b60006040820190508181036000830152614d4f8161477e565b90508181036020830152614d63818461442f565b905092915050565b60006020820190508181036000830152614d84816147b5565b9050919050565b60006020820190508181036000830152614da4816147ec565b9050919050565b60006040820190508181036000830152614dc4816147ec565b9050614dd36020830184614420565b92915050565b60006020820190508181036000830152614df281614823565b9050919050565b60006040820190508181036000830152614e1281614823565b9050614e216020830184614420565b92915050565b60006020820190508181036000830152614e408161485a565b9050919050565b60006040820190508181036000830152614e608161485a565b9050614e6f602083018461432b565b92915050565b60006020820190508181036000830152614e8e81614891565b9050919050565b60006020820190508181036000830152614eae816148c8565b9050919050565b60006040820190508181036000830152614ece816148c8565b90508181036020830152614ee2818461442f565b905092915050565b60006020820190508181036000830152614f03816148ff565b9050919050565b60006040820190508181036000830152614f23816148ff565b90508181036020830152614f378184614465565b905092915050565b6000602082019050614f546000830184614936565b92915050565b600060a082019050614f6f6000830188614936565b614f7c6020830187614936565b614f89604083018661432b565b614f96606083018561432b565b614fa36080830184614936565b9695505050505050565b6000604051905081810181811067ffffffffffffffff82111715614fd057600080fd5b8060405250919050565b600067ffffffffffffffff821115614ff157600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561501957600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561504157600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561506957600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561509157600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156150bd57600080fd5b601f19601f8301169050602081019050919050565b6000602082019050919050565b6000819050919050565b60008160005260206000209050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60008115159050919050565b6000819050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006151ac82615141565b9050919050565b60006151be82615141565b9050919050565b60006151d082615141565b9050919050565b60006151e282615141565b9050919050565b6000819050919050565b6000819050919050565b600061520882615141565b9050919050565b600061521a82615141565b9050919050565b82818337600083830152505050565b60005b8381101561524e578082015181840152602081019050615233565b8381111561525d576000848401525b50505050565b6000601f19601f83011690509190505600a265627a7a7230582092fded645e7a028db262915d22e450195cfef8d8fae09c6ae73b5b0385cf13116c6578706572696d656e74616cf50037"};

    public static final String SM_BINARY = String.join("", SM_BINARY_ARRAY);

    public static final String[] ABI_ARRAY = {"[{\"constant\":false,\"inputs\":[{\"name\":\"transactionAddress\",\"type\":\"address[]\"},{\"name\":\"amount\",\"type\":\"uint256\"},{\"name\":\"stringValueList\",\"type\":\"string[]\"},{\"name\":\"typeList\",\"type\":\"int256[]\"}],\"name\":\"write\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"uint256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"uintCondition\",\"type\":\"uint256[]\"},{\"name\":\"addressCondtion\",\"type\":\"address[]\"},{\"name\":\"limit\",\"type\":\"int256[]\"}],\"name\":\"query\",\"outputs\":[{\"name\":\"\",\"type\":\"string[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"addBook\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"termAddress\",\"type\":\"address\"},{\"name\":\"assetName\",\"type\":\"string\"},{\"name\":\"orgAddr\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"termNo\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"seqNo\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"InsertResult\",\"type\":\"event\"}]"};

    public static final String ABI = String.join("", ABI_ARRAY);

    public static final String FUNC_WRITE = "write";

    public static final String FUNC_GETADDRESS = "getAddress";

    public static final String FUNC_QUERY = "query";

    public static final String FUNC_ADDBOOK = "addBook";

    public static final Event INSERTRESULT_EVENT = new Event("InsertResult", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}, new TypeReference<Uint256>() {}, new TypeReference<Address>() {}, new TypeReference<Address>() {}, new TypeReference<Uint256>() {}));
    ;

    protected FungibleBook(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
    }

    public static String getBinary(CryptoSuite cryptoSuite) {
        return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
    }

    public TransactionReceipt write(List<String> transactionAddress, BigInteger amount, List<String> stringValueList, List<BigInteger> typeList) {
        final Function function = new Function(
                FUNC_WRITE, 
                Arrays.<Type>asList(transactionAddress.isEmpty()? DynamicArray.empty("address[]"):new DynamicArray<Address>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(transactionAddress, Address.class)),
                new Uint256(amount),
                stringValueList.isEmpty()? DynamicArray.empty("string[]"):new DynamicArray<Utf8String>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(stringValueList, Utf8String.class)),
                typeList.isEmpty()? DynamicArray.empty("int256[]"):new DynamicArray<Int256>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(typeList, Int256.class))),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void write(List<String> transactionAddress, BigInteger amount, List<String> stringValueList, List<BigInteger> typeList, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_WRITE, 
                Arrays.<Type>asList(transactionAddress.isEmpty()? DynamicArray.empty("address[]"):new DynamicArray<Address>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(transactionAddress, Address.class)),
                new Uint256(amount),
                stringValueList.isEmpty()? DynamicArray.empty("string[]"):new DynamicArray<Utf8String>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(stringValueList, Utf8String.class)),
                typeList.isEmpty()? DynamicArray.empty("int256[]"):new DynamicArray<Int256>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(typeList, Int256.class))),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForWrite(List<String> transactionAddress, BigInteger amount, List<String> stringValueList, List<BigInteger> typeList) {
        final Function function = new Function(
                FUNC_WRITE, 
                Arrays.<Type>asList(transactionAddress.isEmpty()? DynamicArray.empty("address[]"):new DynamicArray<Address>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(transactionAddress, Address.class)),
                new Uint256(amount),
                stringValueList.isEmpty()? DynamicArray.empty("string[]"):new DynamicArray<Utf8String>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(stringValueList, Utf8String.class)),
                typeList.isEmpty()? DynamicArray.empty("int256[]"):new DynamicArray<Int256>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(typeList, Int256.class))),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple4<List<String>, BigInteger, List<String>, List<BigInteger>> getWriteInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_WRITE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Address>>() {}, new TypeReference<Uint256>() {}, new TypeReference<DynamicArray<Utf8String>>() {}, new TypeReference<DynamicArray<Int256>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple4<List<String>, BigInteger, List<String>, List<BigInteger>>(

                convertToNative((List<Address>) results.get(0).getValue()), 
                (BigInteger) results.get(1).getValue(), 
                convertToNative((List<Utf8String>) results.get(2).getValue()), 
                convertToNative((List<Int256>) results.get(3).getValue())
                );
    }

    public Tuple2<Boolean, List<BigInteger>> getWriteOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_WRITE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<StaticArray2<Uint256>>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<Boolean, List<BigInteger>>(

                (Boolean) results.get(0).getValue(), 
                convertToNative((List<Uint256>) results.get(1).getValue())
                );
    }

    public TransactionReceipt getAddress() {
        final Function function = new Function(
                FUNC_GETADDRESS, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void getAddress(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_GETADDRESS, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForGetAddress() {
        final Function function = new Function(
                FUNC_GETADDRESS, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getGetAddressOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_GETADDRESS, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public List query(List<BigInteger> uintCondition, List<String> addressCondtion, List<BigInteger> limit) throws ContractException {
        final Function function = new Function(FUNC_QUERY, 
                Arrays.<Type>asList(uintCondition.isEmpty()? DynamicArray.empty("uint256[]"):new DynamicArray<Uint256>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(uintCondition, Uint256.class)),
                addressCondtion.isEmpty()? DynamicArray.empty("address[]"):new DynamicArray<Address>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(addressCondtion, Address.class)),
                limit.isEmpty()? DynamicArray.empty("int256[]"):new DynamicArray<Int256>(
                        org.fisco.bcos.sdk.abi.Utils.typeMap(limit, Int256.class))),
                Arrays.<TypeReference<?>>asList(new TypeReference<DynamicArray<Utf8String>>() {}));
        List<Type> result = (List<Type>) executeCallWithSingleValueReturn(function, List.class);
        return convertToNative(result);
    }

    public TransactionReceipt addBook() {
        final Function function = new Function(
                FUNC_ADDBOOK, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void addBook(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_ADDBOOK, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForAddBook() {
        final Function function = new Function(
                FUNC_ADDBOOK, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<BigInteger> getAddBookOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_ADDBOOK, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<BigInteger>(

                (BigInteger) results.get(0).getValue()
                );
    }

    public List<InsertResultEventResponse> getInsertResultEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(INSERTRESULT_EVENT, transactionReceipt);
        ArrayList<InsertResultEventResponse> responses = new ArrayList<InsertResultEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            InsertResultEventResponse typedResponse = new InsertResultEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.termNo = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.seqNo = (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.from = (String) eventValues.getNonIndexedValues().get(2).getValue();
            typedResponse.to = (String) eventValues.getNonIndexedValues().get(3).getValue();
            typedResponse.amount = (BigInteger) eventValues.getNonIndexedValues().get(4).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeInsertResultEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(INSERTRESULT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeInsertResultEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(INSERTRESULT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public static FungibleBook load(String contractAddress, Client client, CryptoKeyPair credential) {
        return new FungibleBook(contractAddress, client, credential);
    }

    public static FungibleBook deploy(Client client, CryptoKeyPair credential, String termAddress, String assetName, String orgAddr) throws ContractException {
        String encodedConstructor = FunctionEncoder.encodeConstructor(Arrays.<Type>asList(new Address(termAddress),
                new Utf8String(assetName),
                new Address(orgAddr)));
        return deploy(FungibleBook.class, client, credential, getBinary(client.getCryptoSuite()), encodedConstructor);
    }

    public static class InsertResultEventResponse {
        public TransactionReceipt.Logs log;

        public BigInteger termNo;

        public BigInteger seqNo;

        public String from;

        public String to;

        public BigInteger amount;
    }
}
